#include "paras.h"

time_t Paras::time_start=time(NULL);
time_t Paras::time_now=time(NULL);
int Paras::runningTime=0;

bool Paras::autoRun=0;//是否自动运行
QString Paras::configPath="config.ini";//配置文件路径

QString Paras::cameraName="0";//相机名称
double Paras::cameraExposure=20000.0;//相机曝光时间
QString Paras::cameraWb="1.86|1.0|2.2";//相机白平衡

int Paras::cameraIndex=0;//相机索引
cv::Point Paras::resolution=cv::Point(0,0);//相机分辨率

QString Paras::PLCIP="192.168.0.1";//PLC IP
int Paras::PLCPort=50000;//PLC端口

int Paras::Work_model=0;//工作模式
int Paras::Work_state=0;//工作状态 0:未运行 1:运行中 2:标注模式-未运行 3:标注模式-运行中  4:标定模式-未运行 5:标定模式-运行中 6:PLC控制
QString Paras::product_name="0";//产品名称

int Paras::cap_num=0;//抓取数量
int Paras::capacity=0;//产能

cv::VideoCapture Paras::cap=cv::VideoCapture();//相机
bool Paras::is_cap_available=0;//判断相机是否可用

QString Paras::matrix="0.|0.|0.|0.|0.|0.|0.|0.|0.";//相机矫正矩阵
QString Paras::process_para="255|80|25|51|1.3|0.8|1300000|500000";//图像处理参数

QString Paras::logPath="../../logFile";//日志文件路径
QString Paras::tempPath="./models";//模板文件路径
QString Paras::modelName="0";//机型名称

QList<QCameraInfo> Paras::cameraList=QCameraInfo::availableCameras();//相机列表

int Paras::timerCaptureInterval=200;//定时器间隔
int Paras::timerProcessInterval=1000;//定时器间隔
QTimer *Paras::timerCapture=new QTimer();//定时器
QTimer *Paras::timerProcess=new QTimer();//定时器

cv::Mat Paras::image=cv::Mat();//图像-mutexImg
cv::Mat Paras::imageProcess=cv::Mat();//图像处理
cv::Mat Paras::templateImage=cv::Mat();//模板图像-templateMutexMat
cv::Mat Paras::fixedframe=cv::Mat();//固定的图像-fixedframeMutexMat
cv::Mat Paras::imageShow=cv::Mat();//图像显示-mutexImageShow

QMutex Paras::frameMutexMat=QMutex();//图像锁
QMutex Paras::templateMutexMat=QMutex();//模板图像锁
QMutex Paras::mutexImg=QMutex();//图像锁
QMutex Paras::mutexCap=QMutex();//抓取锁
QMutex Paras::mutexMode=QMutex();//模式锁
QMutex Paras::mutexTemp=QMutex();//模板绘制锁
QMutex Paras::fixedframeMutexMat=QMutex();//固定照片锁
QMutex Paras::mutexImageShow=QMutex();//图像显示锁

int Paras::currentPoint=0;//当前点
cv::Point2d Paras::tempLeftTop= cv::Point2d(0,0);//模板左上角
cv::Point2d Paras::tempRightTop= cv::Point2d(0,0);//模板右上角
cv::Point2d Paras::tempRightButtom= cv::Point2d(0,0);//模板右下角
cv::Point2d Paras::tempLeftButtom= cv::Point2d(0,0);//模板左下角
cv::Point2d Paras::tempCenter= cv::Point2d(0,0);//模板中心
int Paras::tempwidth=0;
int Paras::tempheight=0;
double Paras::tempangle=0;

// Path: src\common\paras.cpp
bool Paras::checkConfig()
{
    //如果配置文件大小为0,则以初始值继续运行,并生成配置文件
    QFile file(Paras::configPath);
    if (file.size() == 0) {
        newConfig();
        return false;
    }

    //如果配置文件不完整,则以初始值继续运行,并生成配置文件
    if (file.open(QFile::ReadOnly)) {
        bool ok = true;
        while (!file.atEnd()) {
            QString line = file.readLine();
            line = line.replace("\r", "");
            line = line.replace("\n", "");
            QStringList list = line.split("=");

            if (list.count() == 2) {
                if (list.at(1) == "") {
                    ok = false;
                    break;
                }
            }
        }

        if (!ok) {
            newConfig();
            return false;
        }
    } else {
        newConfig();
        return false;
    }
    return true;
}

void Paras::newConfig()
{
    writeConfig();
}

//该函数用于保存配置文件
void Paras::writeConfig()
{
    QSettings set(Paras::configPath, QSettings::IniFormat);

    set.beginGroup("BaseConfig");
    set.setValue("autoRun", Paras::autoRun);
    set.setValue("configPath", Paras::configPath);
    set.endGroup();

    set.beginGroup("CameraConfig");
    set.setValue("cameraName", Paras::cameraName);
    set.setValue("cameraExposure", Paras::cameraExposure);
    set.setValue("cameraWb", Paras::cameraWb);
    set.setValue("matrix", Paras::matrix);
    set.setValue("process_para", Paras::process_para);
    set.endGroup();

    set.beginGroup("PLCConfig");
    set.setValue("PLCIP", Paras::PLCIP);
    set.setValue("PLCPort", Paras::PLCPort);
    set.endGroup();

    return;
}

//该函数用于读取配置文件
void Paras::readConfig()
{
    if(!checkConfig())
        return;

    QSettings set(Paras::configPath, QSettings::IniFormat);

    set.beginGroup("BaseConfig");
    Paras::autoRun = set.value("autoRun").toBool();
    Paras::configPath = set.value("configPath").toString();
    set.endGroup();

    set.beginGroup("CameraConfig");
    Paras::cameraName = set.value("cameraName").toString();
    Paras::cameraExposure = set.value("cameraExposure").toDouble();
    Paras::cameraWb = set.value("cameraWb").toString();
    Paras::matrix = set.value("matrix").toString();
    Paras::process_para = set.value("process_para").toString();
    set.endGroup();

    set.beginGroup("PLCConfig");
    Paras::PLCIP = set.value("PLCIP").toString();
    Paras::PLCPort = set.value("PLCPort").toInt();
    set.endGroup();

    return;
}

void Paras::saveLog()
{
    /*QString logFilePath=Paras::logPath+"/"+QDateTime::currentDateTime().toString("yyyy-MM-dd")+"/"+Paras::product_name+".txt";

    QSettings set(logFilePath, QSettings::IniFormat);

    //下面内容将在log记录中添加
    //static int cap_num;
    //static std::vector<int> cap_interval;
    //static std::vector<int> cap_angle;
    //static std::vector<int> cap_x;
    //static std::vector<int> cap_y;

    set.beginGroup("Log");
    set.setValue("抓取数量", cap_num).toInt();
    set.setValue("抓取间隔", cap_interval).toInt();
    set.setValue("抓取角度", cap_angle).toInt();
    set.setValue("抓取x坐标", cap_x).toInt();
    set.setValue("抓取y坐标", cap_y).toInt();
    set.endGroup();*/

    return;
}

void Paras::changeMode(int mode){
    QMutexLocker locker(&Paras::mutexMode);
    Paras::Work_state=mode;
    return;
}